package edu.ynu.se.xiecheng.achitectureclass.digitalagriculture.service;

import edu.ynu.se.xiecheng.achitectureclass.digitalagriculture.dao.GreenhouseDAO;
import edu.ynu.se.xiecheng.achitectureclass.digitalagriculture.entity.GreenhouseEntity;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;

/**
 * 温室服务类
 * 设计原则体现：
 * 1. 单一职责原则(SRP) - 该类专注于温室相关的业务逻辑
 * 2. 依赖注入原则(DI) - 通过构造函数注入所需的DAO
 */
@Service
public class GreenhouseService {

    private final GreenhouseDAO greenhouseDAO;

    public GreenhouseService(GreenhouseDAO greenhouseDAO) {
        this.greenhouseDAO = greenhouseDAO; // 依赖注入
    }

    /**
     * 根据ID获取温室
     * 设计原则体现：
     * 1. 高内聚 - 方法功能单一，专注于获取温室
     * 2. 关注点分离 - 数据访问逻辑与业务逻辑分离
     */
    public GreenhouseEntity getById(Long boxId) {
        return greenhouseDAO.findById(boxId).orElse(null); // 调用DAO层方法
    }

    /**
     * 保存温室
     * 设计原则体现：
     * 1. 事务管理 - 确保保存操作的原子性
     * 2. 单一职责原则 - 方法只负责保存温室
     */
    public void save(GreenhouseEntity greenhouseEntity) {
        greenhouseDAO.save(greenhouseEntity); // 调用DAO层方法
    }

    /**
     * 删除温室
     * 设计原则体现：
     * 1. 事务管理 - 确保删除操作的原子性
     * 2. 单一职责原则 - 方法只负责删除温室
     */
    public void delete(Long id) {
        greenhouseDAO.deleteById(id); // 调用DAO层方法
    }

    /**
     * 分页查询温室
     * 设计原则体现：
     * 1. 开放封闭原则(OCP) - 方法支持不同的分页需求
     * 2. 迪米特原则 - 只与直接依赖的DAO交互
     */
    public Page<GreenhouseEntity> page(Integer current, Integer size) {
        return greenhouseDAO.findAll(PageRequest.of(current, size)); // 调用DAO层方法
    }
}
